from django.shortcuts import render
from libs.captcha.captcha import captcha
# Create your views here.
from django.http import HttpResponse,JsonResponse
from django.views import View
from django_redis import get_redis_connection
#logging作用是记录日志
import random
import logging
logger = logging.getLogger('django')
# 导入云通讯短信验证码模块
from libs.yuntongxun.sms import CCP
class ImageCodeView(View):
    """图形验证码"""

    def get(self, request, uuid):
        """
        :param request: 请求对象
        :param uuid: 唯一标识图形验证码所属于的用户
        :return: image/jpeg
        """
        # 生成图片验证码
        text, image = captcha.generate_captcha()

        # 保存图片验证码
        redis_conn = get_redis_connection('code')
        # 保存图片验证码到redis中, 有效期为300秒
        redis_conn.setex('img_%s' % uuid, 300, text)

        # 响应图片验证码
        return HttpResponse(image, content_type='image/jpeg')

# 免费测试

# 免费测试流程：注册 >> 绑定测试号 >> 开发测试

# 短信业务免费开发测试
# 1.注册
# 我们提供免费开发测试，【免费开发测试前，请先 注册 成为平台用户】。     
# 3.开发测试
# 开发测试过程请参考 短信业务接口 及 Demo示例 / sdk参考（新版）示例。Java环境安装请参考"新版sdk"。
# 4.免费开发测试注意事项
# 1.免费开发测试需要使用到"控制台首页"，开发者主账户相关信息，如主账号、应用ID等。

# 2.免费开发测试使用的模板ID为1，具体内容：【云通讯】您的验证码是{1}，请于{2}分钟内正确输入。其中{1}和{2}为短信模板参数。

# 3.测试成功后，即可申请短信模板并 正式使用 。    
# 4.测试短信模板申请流程
# 1.登录云通讯官网，点击"控制台首页"，进入"短信模板"页面。
# 2.点击"新增短信模板"，填写短信模板内容，申请短信模板。
# 3.审核通过后，即可在"短信模板"页面查看短信模板ID。
class SmsCodeView(View):
    def get(self, request, mobile):
        """
        :param reqeust: 请求对象
        :param mobile: 手机号
        :return: JSON
        """
        image_code_client = request.GET.get('image_code')
        uuid = request.GET.get('image_code_id')
        #校验参数
        if not all([image_code_client, uuid]):
            return JsonResponse({'code':400, 'errmsg':'缺少必传参数'})
        #创建连接到redis的对象
        redis_conn = get_redis_connection('code')
        #从redis中获取图片验证码
        image_code_server = redis_conn.get('img_%s' % uuid)
        if image_code_server is None:
            # 图片验证码过期或不存在
            return JsonResponse({'code':400, 'errmsg':'图片验证码过期或不存在'})
        try:
            redis_conn.delete('img_%s' % uuid)
        except Exception as e:
            logger.error(e)

        #对比图形验证码
        if image_code_server.decode().lower() != image_code_client.lower():
            return JsonResponse({'code':400, 'errmsg':'图片验证码错误'})
        
        # 校验发送标记，防止用户重复发送短信验证码
        send_flag = redis_conn.get('send_flag_%s'% mobile)
        if send_flag:
            return JsonResponse({'code':400, 'errmsg':'请稍后再发送短信验证码'})

        # 生成短信验证码：生成4位数验证码
        sms_code = '%04d' % random.randint(0, 9999)
        # #管道3步
        # # 1. 创建Redis管道
        # p1 = redis_conn.pipeline()
        # # 2. 将Redis请求添加到队列
        # # 保存短信验证码到redis中, 有效期为300秒
        # p1.setex('sms_%s' % mobile, 300, sms_code)
        # # 添加一个发送标记，防止用户重复发送短信验证码, 有效期为60秒
        # p1.setex('send_flag_%s'% mobile, 60, 1)
        # # 3. 执行请求
        # p1.execute()
        
        # # logger.info(sms_code)
        # 保存短信验证码到redis中
        redis_conn.setex('sms_%s' % mobile, 300, sms_code)
        # 添加一个发送标记，防止用户重复发送短信验证码
        redis_conn.setex('send_flag_%s'% mobile, 60, 1)
        
        # 使用Celery异步发送短信验证码
        from celery_tasks.sms.tasks import send_sms_code
        send_sms_code.delay(mobile, sms_code)
        # 响应短信验证码
        return JsonResponse({'code':0, 'errmsg':'发送短信验证码成功'})